{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "        <style>\n",
       "        .output_wrapper, .output {\n",
       "            height:auto !important;\n",
       "            max-height:100000px;\n",
       "        }\n",
       "        .output_scroll {\n",
       "            box-shadow:none !important;\n",
       "            webkit-box-shadow:none !important;\n",
       "        }\n",
       "        </style>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "import sys\n",
    "sys.path.insert(0,'..') # allow us to format the book\n",
    "\n",
    "# use same formatting as rest of book so that the plots are\n",
    "# consistant with that look and feel.\n",
    "import book_format\n",
    "book_format.set_style()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "def update(mu1, var1, mu2, var2):\n",
    "    mean = (var1*mu2 + var2*mu1) / (var1+var2)\n",
    "    variance = 1 / (1/var1 + 1/var2)\n",
    "    return (mean, variance)\n",
    "\n",
    "def predict(pos, variance, movement, movement_variance):\n",
    "    return (pos + movement, variance + movement_variance)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This notebook creates the animations for the Kalman Filter chapter. It is not really intended to be a readable part of the book, but of course you are free to look at the source code, and even modify it. However, if you are interested in running your own animations, I'll point you to the examples subdirectory of the book, which contains a number of python scripts that you can run and modify from an IDE or the command line. This module saves the animations to GIF files, which is quite slow and not very interactive. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_3d_covariance(ax, mean, cov):\n",
    "    \"\"\" plots a 2x2 covariance matrix positioned at mean. mean will be plotted\n",
    "    in x and y, and the probability in the z axis.\n",
    "\n",
    "    Parameters\n",
    "    ----------\n",
    "    mean :  2x1 tuple-like object\n",
    "        mean for x and y coordinates. For example (2.3, 7.5)\n",
    "\n",
    "    cov : 2x2 nd.array\n",
    "       the covariance matrix\n",
    "\n",
    "    \"\"\"\n",
    "\n",
    "    # compute width and height of covariance ellipse so we can choose\n",
    "    # appropriate ranges for x and y\n",
    "    o,w,h = stats.covariance_ellipse(cov,3)\n",
    "    # rotate width and height to x,y axis\n",
    "    wx = abs(w*np.cos(o) + h*np.sin(o))*1.2\n",
    "    wy = abs(h*np.cos(o) - w*np.sin(o))*1.2\n",
    "\n",
    "\n",
    "    # ensure axis are of the same size so everything is plotted with the same\n",
    "    # scale\n",
    "    if wx > wy:\n",
    "        w = wx\n",
    "    else:\n",
    "        w = wy\n",
    "\n",
    "    minx = mean[0] - w\n",
    "    maxx = mean[0] + w\n",
    "    miny = mean[1] - w\n",
    "    maxy = mean[1] + w\n",
    "\n",
    "    xs = np.arange(minx, maxx, (maxx-minx)/40.)\n",
    "    ys = np.arange(miny, maxy, (maxy-miny)/40.)\n",
    "    xv, yv = np.meshgrid (xs, ys)\n",
    "\n",
    "    zs = np.array([100.* stats.multivariate_gaussian(np.array([x,y]),mean,cov) \\\n",
    "                   for x,y in zip(np.ravel(xv), np.ravel(yv))])\n",
    "    zv = zs.reshape(xv.shape)\n",
    "\n",
    "    ax = plt.figure().add_subplot(111, projection='3d')\n",
    "    ax.plot_surface(xv, yv, zv, rstride=1, cstride=1, cmap=cm.autumn)\n",
    "\n",
    "    ax.set_xlabel('X')\n",
    "    ax.set_ylabel('Y')\n",
    "\n",
    "    ax.contour(xv, yv, zv, zdir='x', offset=minx-1, cmap=cm.autumn)\n",
    "    ax.contour(xv, yv, zv, zdir='y', offset=maxy, cmap=cm.BuGn)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(25, 20.4)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "voltage"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 648x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "stats.plot_gaussian_pdf(25, 20.4);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1fea90c9248>]"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ax1.plot([3,2,4])\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 648x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy.random as random\n",
    "import math\n",
    "import stats\n",
    "from kf_book.gif_animate import animate\n",
    "\n",
    "sensor_error = 1.2**2\n",
    "movement_error = .2\n",
    "movement = 0\n",
    "voltage = (25, 20) #who knows what the first value is?\n",
    "\n",
    "volts = [14.44, 18.74, 17.21, 15.98, 16.76, 14.8, 16.01, 16.90, 15.41, 17.31,\n",
    "        16.39, 17.96]\n",
    "ps = [voltage[0]]\n",
    "\n",
    "\n",
    "i = 0\n",
    "pred = 0\n",
    "def volt_animate(frame):\n",
    "    global i, ps, voltage, Z, x, pred, ax1, ax2\n",
    "    \n",
    "    step = frame % 4\n",
    "    ax1.set_ylim([14, 26])\n",
    "    ax1.set_xlim([0, 10])\n",
    "\n",
    "    if step == 0:\n",
    "        prev = voltage[0]\n",
    "        voltage = predict(voltage[0], voltage[1], movement, movement_error)\n",
    "        pred = voltage[0]\n",
    "        ax1.plot([i, i+1], [prev, pred], c='g') \n",
    "        \n",
    "    elif step == 1:\n",
    "        Z = volts[i]\n",
    "        i += 1 \n",
    "        ax1.scatter(i, Z, marker='+', s=64, color='r')\n",
    "\n",
    "    elif step == 2:\n",
    "        ax1.plot([i,i], [pred, Z], c='r', alpha=0.3)\n",
    "\n",
    "    else:\n",
    "        voltage = update(voltage[0], voltage[1], Z, sensor_error)\n",
    "        ps.append(voltage[0])\n",
    "        ax1.plot(ps, c='b')\n",
    "        \n",
    "    ax2.cla()\n",
    "    stats.plot_gaussian_pdf(voltage[0], voltage[1], xlim=[0,32], ax=ax2)\n",
    "    ax2.set_xlim([10, 25])\n",
    "    ax2.set_ylim([0, 1])\n",
    "    #plt.tight_layout()\n",
    "        \n",
    "N=12\n",
    "fig = plt.figure()\n",
    "ax1 = fig.add_subplot(211)\n",
    "ax2 = fig.add_subplot(212)\n",
    "animate('05_volt_animate.gif', volt_animate, N*3, 350, fig);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src='05_volt_animate.gif'>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 648x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from __future__ import print_function, division\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy.random as random\n",
    "import math\n",
    "import stats\n",
    "from kf_book.gif_animate import animate\n",
    "\n",
    "# assume dog is always moving 1m to the right\n",
    "movement = 1\n",
    "movement_error = .05\n",
    "sensor_error = 2.5\n",
    "pos = (0, 100)   # gaussian N(0,100)\n",
    "\n",
    "# this is the recorded output of a run of the dog sensor with an initial\n",
    "# seed of 200\n",
    "ZS = [-2.07, 6.05, 4.51, 3.47, 5.76, 5.93, 6.53, 9.01, 7.53, 11.68, \n",
    "      11.15, 14.76, 13.45, 16.15, 19.05, 14.87, 20.90, 15.75, \n",
    "      17.16, 20.50]\n",
    "zs = []\n",
    "ps = []\n",
    "\n",
    "N=20\n",
    "\n",
    "def dog_animate(frame):\n",
    "    global pos, zs, ps,  N, ZS, ax1, ax2, fig\n",
    "    pos = predict(pos[0], pos[1], movement, movement_error)    \n",
    "    Z = ZS[frame]\n",
    "    zs.append(Z)\n",
    "    \n",
    "    pos = update(pos[0], pos[1], Z, sensor_error)\n",
    "    ps.append(pos[0])\n",
    "\n",
    "\n",
    "\n",
    "    ax1.plot(zs,c='r', linestyle='dashed')\n",
    "    ax1.set_xlim([0, N*1.2])\n",
    "    ax1.set_ylim([0, N*1.2])\n",
    "\n",
    "    if len(ps) > 1:\n",
    "        ax1.plot(ps, c='#8EBA42')\n",
    "        \n",
    "    ax2.cla()\n",
    "    stats.plot_gaussian_pdf(pos[0], pos[1], xlim=[0,N*1.2], ax=ax2)\n",
    "    ax2.set_ylim(0, 1)\n",
    "    fig.tight_layout()\n",
    "\n",
    "fig = plt.figure()\n",
    "ax1 = fig.add_subplot(211)\n",
    "ax2 = fig.add_subplot(212)\n",
    "animate('05_dog_track.gif', dog_animate, N, 200, fig=fig)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src='05_dog_track.gif'>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
